package com.partvoyage.server.service.projet;

import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.partvoyage.client.service.infopoint.InfoPointService;
import com.partvoyage.client.service.projet.ProjetBean;
import com.partvoyage.client.service.projet.ProjetService;
import com.partvoyage.server.dao.ProjetDAO;
import com.partvoyage.server.dao.ProjetEntity;
import com.partvoyage.server.service.infopoint.InfoPointServiceImpl;
import com.partvoyage.shared.DateDepartArriveBean;
import com.partvoyage.shared.DateHelper;
import com.partvoyage.shared.InfoPointBean;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class ProjetServiceImpl extends RemoteServiceServlet implements
		ProjetService {
	public void deleteProjetId(Long projetId) {
		if (projetId == null) {
			throw new IllegalArgumentException("le projetId ne peut être null");
		}
		// suppression des points liés au projet
		InfoPointService infoPointService = new InfoPointServiceImpl();
		infoPointService.deleteAllByProjetId(projetId);
		// suppression du projet
		ProjetDAO dao = new ProjetDAO();
		ProjetEntity projetEntity = null;
		try {
			projetEntity = dao.get(projetId);
		} catch (EntityNotFoundException e) {
			throw new IllegalArgumentException("le projet " + projetId
					+ " n'a pas été trouvé");
		}
		dao.delete(projetEntity);
	}

	public ProjetBean create(String nom, String commentaire,
			String compteProprietaire, String type) {
		ProjetDAO dao = new ProjetDAO();
		ProjetEntity projetEntity = new ProjetEntity();
		projetEntity.setNom(nom);
		projetEntity.setCommentaire(commentaire);
		projetEntity.setCompteProprietaire(compteProprietaire);
		projetEntity.setType(type);
		// Key<ProjetEntity> key = dao.put(tp);
		dao.put(projetEntity);
		ProjetBean projetBean = new ProjetBean();
		projetBean.setProjetId(projetEntity.getId());
		projetBean.setNom(projetEntity.getNom());
		projetBean.setCommentaire(projetEntity.getCommentaire());
		projetBean.setCompteProprietaire(projetEntity.getCompteProprietaire());
		projetBean.setType(projetEntity.getType());
		GWT.log("projet créé: " + projetBean);
		return projetBean;
	}

	public Double getCoutTotal(Long projetId) {
		Double valeurTotal = 0.0;
		InfoPointService infoPointService = new InfoPointServiceImpl();
		List<InfoPointBean> lists = infoPointService
				.findAllByProjetId(projetId);
		for (InfoPointBean infoPointBean : lists) {
			String cout = infoPointBean.getCout();
			System.out.println("Info pour calcul cout " + infoPointBean);
			if (cout != null && !cout.isEmpty()) {
				valeurTotal += Double.valueOf(cout);
			}
		}
		return valeurTotal;

	}

	public ProjetBean findByProjetCourantByCompteProprietaire(
			String compteProprietaire) {
		if (compteProprietaire == null) {
			throw new IllegalArgumentException(
					"le compte propriétaire ne peut être null");
		}
		ProjetDAO dao = new ProjetDAO();
		ProjetEntity projetEntity;
		ProjetBean projetBean = new ProjetBean();
		try {
			projetEntity = dao
					.findByProjetCourantByCompteProprietaire(compteProprietaire);
			if (projetEntity == null) {
				GWT.log("aucun projet n'existe pour le propriétaire "
						+ compteProprietaire);
				return null;
			}
			projetBean.setProjetId(projetEntity.getId());
			projetBean.setCompteProprietaire(projetEntity
					.getCompteProprietaire());
			projetBean.setNom(projetEntity.getNom());
			projetBean.setCommentaire(projetEntity.getCommentaire());
			projetBean.setType(projetEntity.getType());
			GWT.log("Le projet courant a été trouvé: " + projetBean);
		} catch (EntityNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return projetBean;
	}

	public ProjetBean update(ProjetBean projetBean) throws Exception {
		if (projetBean == null) {
			throw new IllegalArgumentException(
					"Erreur de mise à jour du projet, le bean est null");
		}
		ProjetDAO dao = new ProjetDAO();
		ProjetEntity projetEntity = null;
		try {
			projetEntity = dao.get(projetBean.getProjetId());
		} catch (EntityNotFoundException e) {
			throw new Exception("Le projet  " + projetBean.getProjetId()
					+ " n'existe pas");
		}
		projetEntity.synchronizeDonnee(projetBean);
		dao.put(projetEntity);
		return projetBean;
	}

	@Override
	public DateDepartArriveBean getDateDepartEtArrive(Long projetId) {
		DateDepartArriveBean dateDepartArriveBean = new DateDepartArriveBean();
		InfoPointService infoPointService = new InfoPointServiceImpl();
		List<InfoPointBean> lists = infoPointService
				.findAllByProjetId(projetId);
		if (lists == null || lists.isEmpty()) {
			return dateDepartArriveBean;
		}
		if (lists.size() == 1) {
			String dateFormatee = DateHelper.getToStringPourLog(lists.get(0)
					.getQuand());
			dateDepartArriveBean.setDateDepart(dateFormatee);
			dateDepartArriveBean.setDateArrive(dateFormatee);
		}
		Long dateInf = Long.MAX_VALUE;
		Long dateSup = Long.MIN_VALUE;
		for (InfoPointBean infoPointBean : lists) {
			if (infoPointBean.getQuand() == null) {
				continue;
			}
			Long time = infoPointBean.getQuand().getTime();
			if (time < dateInf) {
				dateInf = time;
				String dateFormatee = DateHelper
						.getToStringPourLog(infoPointBean.getQuand());
				dateDepartArriveBean.setDateDepart(dateFormatee);
			}
			if (time > dateSup) {
				dateSup = time;
				String dateFormatee = DateHelper
						.getToStringPourLog(infoPointBean.getQuand());
				dateDepartArriveBean.setDateArrive(dateFormatee);
			}
		}
		return dateDepartArriveBean;
	}

	@Override
	public List<ProjetBean> findAllProjetByUser(String compteProprietaire) {
		List<ProjetBean> projetBeans = new ArrayList<ProjetBean>();
		ProjetDAO dao = new ProjetDAO();
		List<ProjetEntity> projets = dao.listByProperty("compteProprietaire",
				compteProprietaire);
		for (ProjetEntity projet : projets) {
			ProjetBean projetBean = synchronizeDonnee(projet);
			projetBeans.add(projetBean);
		}
		return projetBeans;
	}

	/**
	 * recopie les données mais pas l'id
	 * 
	 * @param projetBean
	 */
	public ProjetBean synchronizeDonnee(ProjetEntity projetEntity) {
		ProjetBean projetBean = new ProjetBean();
		projetBean.setCompteProprietaire(projetEntity.getCompteProprietaire());
		projetBean.setCommentaire(projetEntity.getCommentaire());
		projetBean.setNom(projetEntity.getNom());
		projetBean.setType(projetEntity.getType());
		projetBean.setProjetId(projetEntity.getId());
		return projetBean;

	}

	@Override
	public ProjetBean findProjetById(Long projetId) throws Exception {
		ProjetDAO dao = new ProjetDAO();
		ProjetEntity projetEntity = null;
		try {
			projetEntity = dao.get(projetId);
		} catch (EntityNotFoundException e) {
			throw new Exception("Le projet  " + projetId + " n'existe pas");
		}
		return synchronizeDonnee(projetEntity);
	}
}
